import axios from 'axios'
import store from '../store'
import { message } from 'antd'

const Axios = axios.create({
    baseURL: '/apis',
    timeout: 15000
})

// 实现拦截
Axios.interceptors.request.use(config => {
    // 路由是否需要拦截
    const otherUrl = ['/user/login']

    if (otherUrl.includes(config.url)) {
        return config
    }

    // 获取token数据，判断token是否存在，存在则发送请求，否则进行通用返回
    let token = store.getState().common.token
    if (!token) {
        message.warning('用户的票据失效，请重新登录后再进行接口调用')
        return Promise.reject({code: 400, message: '前端错误，已被拦截'})
    } else {
        config.headers.token = token
        return config
    }
})

Axios.interceptors.response.use(response => {
    // 请求的状态码是否是200
    if (response.status !== 200) {
        message.error(`请求失败，错误信息为：${response.statusText}`)
        return Promise.reject({code: 500, message: '请求以失败，已被拦截处理'})
    }

    if (response.data.code === 403) {
        message.warning('用户的票据失效，请重新登录后再进行接口调用')
        return Promise.reject({code: 400, message: '前端错误，已被拦截'})
    }

    return response.data
})

/**
 * 请求进行async + await处理
 * @param {{url: string, method: 'POST' | 'GET' | 'PUT' | 'DELETE' | 'PATCH', data: any, params: any}} req 请求对象
 * @returns 
 */
export default function(req) {
    if (!req.url) throw new Error('请求必须传递url参数')

    return new Promise(resolve => {
        Axios.request({
            url: req.url,
            method: req.method || 'GET',
            data: req.data || {}, // 除get之外的请求都应该使用body传参
            params: req.params || {},
            // onUploadProgress?: (progressEvent: any) => void
            // 它表示onUploadProgress这个配置对象为一个函数，这个函数不需要返回值，还有一个progressEvent(进度事件对象)形参
            onUploadProgress: req.uploadProgress || (() => {})
        }).then(d => {
            resolve(d)
        }).catch(d => {
            resolve(d)
        })
    })
}